/**
 * * * &&(逻辑与)
 * * 在其操作数中找到第一个虚值表达式并返回它，如果没有找到任何
 * * 虚值表达式，则返回最后一个真值表达式。它采用短路来防止不必要的工作。
 * 
 * * 第一个虚值, 最后一个真值
 */

let one = false && 1 && []
let two = (" " && true && 5)
// console.log(one, two); //false 5


/**
 * * * ||(逻辑或)
 * * 在其操作数中找到第一个真值表达式并返回它。这也使用了短路来防
 * * 止不必要的工作。在支持 ES6 默认函数参数之前，它用于初始化函数中的默认参数值。
 * 
 * * 第一个真值, 获取初始化数据
 */

// console.log(null || 1 || undefined); // 1
function logName(name) {
  let n = name || "Mark";
  console.log(n);
}
logName(); // "Mark"

/**
 * 
 * !! 运算符可以将右侧的值强制转换为布尔值，这也是将值转换为布尔值的一种简单方法。
 */

console.log(!!null); // false
console.log(!!undefined); // false
console.log(!!''); // false
console.log(!!0); // false
console.log(!!NaN); // false
console.log(!!' '); // true
console.log(!!{}); // true
console.log(!![]); // true
console.log(!!1); // true
console.log(!![].length); // false


/**
 * *  可以使用 逗 号 运算符在一行中计算多个表达式。它从左到右求值，并返回右边最后一个项
 * * 目或最后一个操作数的值。
 * 
 */

let x = 5;
x = (x++, x = addFive(x), x *= 2, x -= 5, x += 10);
function addFive(num) {
  return num + 5;
}
console.log(x);   //27